package com.opensource.component.query.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.opensource.component.query.exception.MpExtendException;
import com.opensource.component.query.wrapper.LambdaExtendWrapper;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;

/**
 * @author ZL since on 2021/12/23 下午4:35
 */
public interface ExtendBaseMapper<T> extends BaseMapper<T> {

  /**
   * 多表查询列表
   *
   * @param wrapper 条件包装
   * @param <E>     适配各种传入类型
   * @return 返回包装类型的对象list
   */
  <E> List<Map<String, Object>> selectListExtend(
      @Param(Constants.WRAPPER) LambdaExtendWrapper<E> wrapper);

  /**
   * 多表查询单个
   *
   * @param wrapper 条件包装
   * @param <E>     传入类型
   * @return 返回包装类型的对象
   */
  default <E> Map<String, Object> selectOneExtend(LambdaExtendWrapper<E> wrapper) {
    final List<Map<String, Object>> maps = selectListExtend(wrapper);
    if (CollectionUtils.isNotEmpty(maps)) {
      if (maps.size() == 1) {
        return maps.get(0);
      }
      throw new MpExtendException("One record is expected, but the query result is multiple records");
    }
    return null;
  }

  /**
   * 多表查询count
   *
   * @param wrapper 条件包装
   * @param <E>     返回类型
   * @return 总数
   */
  <E> long selectCountExtend(@Param(Constants.WRAPPER) LambdaExtendWrapper<E> wrapper);

  /**
   * 多表查询分页
   *
   * @param page         分页参数
   * @param queryWrapper 条件包装
   * @return EV
   */
  <EV> Page<EV> selectPageExtend(IPage<T> page,
      @Param(Constants.WRAPPER) LambdaExtendWrapper<T> queryWrapper);


}
